package com.linkoog.devtools.json.file_editer.editer.ui;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.TextNode;
import com.linkoog.devtools.utils.JacksonUtil;
import com.linkoog.devtools.utils.StringUtils;

import java.util.Iterator;
import java.util.Map;

public class JackJsonTreeUtils {



    public static JackJsonTreeNode buildJsonTree(String json){
        if (StringUtils.isBlank(json)){
            return JackJsonTreeNode.DEFAULT;
        }

        try {
            JsonNode jsonNode = JacksonUtil.readTree(json);
            JackJsonTreeNode root = new JackJsonTreeNode("root", jsonNode);
            buildJsonTree(root, JacksonUtil.readTree(json));
            return root;
        } catch (Exception ignore){
            return JackJsonTreeNode.DEFAULT;
        }
    }

    public static void buildJsonTree(JackJsonTreeNode root, JsonNode node){
        if (node.isValueNode()) {
            JackJsonTreeNode childNode = new JackJsonTreeNode(node.toString(), new TextNode(""));
            root.add(childNode);
        }else if (node.isObject()) {
            Iterator<Map.Entry<String, JsonNode>> it = node.fields();
            while (it.hasNext()) {
                Map.Entry<String, JsonNode> entry = it.next();
                String key = entry.getKey();
                JsonNode value = entry.getValue();

                JackJsonTreeNode childNode = new JackJsonTreeNode(key, value);
                root.add(childNode);
                if (! value.isValueNode()) {
                    buildJsonTree(childNode, value);
                }
            }
        } else if (node.isArray()) {
            Iterator<JsonNode> it = node.iterator();
            int i = 0;
            while (it.hasNext()) {
                String key = String.valueOf(i);
                JsonNode value = it.next();
                JackJsonTreeNode childNode = new JackJsonTreeNode(key, value, true);
                root.add(childNode);

                if (!value.isValueNode()) {
                    buildJsonTree(childNode, value);
                }
                i++;
            }
            return;
        }
    }

}
